class Solution {
public:
    /**
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    vector<string> split(string s,string op)
    {
        vector<string>vec;
        int it;
        while((it=s.find(op))&&it!=s.npos)
        {
            vec.push_back(s.substr(0,it));
            s=s.substr(it+1);
        }
        vec.push_back(s);
        return vec;
    }
    bool isIpv4(string ip)
    {
        //1.1.1.1
        //.开头
        //.结尾
        /*长度不能小于7并且开头和结尾都不能是“.”*/
        if(ip.size()<7||ip[0]=='.'||ip[ip.size()-1]=='.')
            return false;
        vector<string>str=split(ip,".");
        //必须有4组
        if(str.size()!=4)
            return false;
        for(int i=0;i<str.size();i++)
        {
            //1..1.1
            //120.01.2.1 长度大于1不能以0开头
            //1234.1.2.1
            if(str[i].size()==0||str[i][0]=='0'&&str[i].size()>1||str[i].size()>3)
                return false;
            int num=0;
            //数字范围应该在0~255
            for(int j=0;j<str[i].size();j++)
            {
                char c=str[i][j];
                //12o.1p.1.q
                if(c<'0'||c>'9')
                    return false;
                num=num*10+(c-'0');
                //256.245.1.1
                if(num>255)
                    return false;
            }
        }
        return true;
    }
    bool isIpv6(string ip)
    {
        //整个字符串长度不能小于15，并且开头和结尾不能是“：”
        if(ip.size()<15||ip[0]==':'||ip[ip.size()-1]==':')
            return false;
        vector<string>str=split(ip,":");
        if(str.size()!=8)
            return false;
        if(ip.find("0000")!=ip.npos)
            return false;
        for(int i=0;i<str.size();i++)
        {
            if(str[i].size()==0||str[i].size()>4)
                return false;
            for(int j=0;j<str[i].size();j++)
            {
                char c=str[i][j];
                //字符范围必须是0~9 a~f A~F
                if(!((c>='0'&&c<='9')||(c>='a'&&c<='z')||(c>='A'&&c<='Z')))
                {
                    return false;
                }
            }
        }
        return true;
    }
    string solve(string IP) {
        // write code here
        if(isIpv4(IP))
            return "IPv4";
        if(isIpv6(IP))
            return "IPv6";
        return "Neither";
    }
};